package com.alibaba.otter.node.etl.load.loader.mq.rabbit.model;

import com.alibaba.fastjson.JSON;
import com.alibaba.otter.node.etl.load.loader.mq.rabbit.consume.HandlerInvoker;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Envelope;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.apache.commons.lang3.builder.ToStringBuilder;

import java.util.Map;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class MessageContext {

    /**
     * 消息，包括消息头，消息属性及byte[]类型的消息体
     */
    private Message message;

    /**
     * 信封，包含了deliveryTag，exchange和routingKey等信息
     */
    private Envelope envelope;

    /**
     * 反序列化后的消息，在序列化完成之前，该值为空
     */
    private Object deserializedMsg;

    /**
     * 接收改消息的channel
     */
    private Channel channel;

    /**
     * 该消息消费者的调用者。
     */
    private HandlerInvoker invoker;

    /**
     * 当前消息的namespace
     */
    private String namespace;

    /**
     * 当前消息的queue
     */
    private String queue;

    /**
     * 上下文变量。用于在RescueAction和EndAction之间传递参数。
     */
    private Map<Object, Object> varMap;


    @Override
    public String toString() {
        ToStringBuilder builder = new ToStringBuilder(this)
            .append("namespace", namespace)
            .append("queue", queue)
            .append("deserializedMsg", deserializedMsg)
            .append("messageHeader", JSON.toJSONString(message.getHeaders()))
            .append("messageProperty", JSON.toJSONString(message.getProperty()))
            .append("varMap", JSON.toJSONString(varMap));
        return builder.toString();
    }
}
